package 链表;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/2/15 19:14
 */
public class leetcode92反转链表II {







    /*
        https://www.bilibili.com/video/BV1sd4y1x7KN/?vd_source=179da737184de5a8f84e4f6c2ee5c350
        看一下 大神， 是怎么样 思考问题的！
     */



    public ListNode sovle(ListNode head,int l,int r){
        ListNode sentinel = new ListNode(-1) ,p0 = sentinel;
        sentinel.next = head;
        for(int i = 0;i < l - 1;i++){ // 让 p0 走到 l的pre 节点上面
            p0 = p0.next;
        }
        ListNode pre = null, cur = p0.next;
        for(int i = 0;i < r - l + 1;i++){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        // 连接 整个链表
        p0.next.next = cur;
        p0.next = pre;

        return sentinel.next;
    }









    /*
        卧槽， 反转的 是 从 left to right
        这里 指 的是 下标！ 傻逼！
        这个过程的 逻辑还是 有点复杂的！

        这题 是真他妈 的 抽象！
        这题 真烦 啊！
     */

    public ListNode solution(ListNode head,int left,int right){
        if(left == right){
            return head;
        }
        ListNode pre = null, cur = head;
        int index = 0;
        while(cur != null){
            index++;
            if(index == left){
                ListNode leftNode = pre , listNode1 = cur;
                // 注意一下 这里的 操作！
                pre = cur;
                cur = cur.next;
                index++;
                pre.next = null;
                ListNode temp;
                while(index != right){
                     temp = cur.next;
                    cur.next = pre;
                    pre = cur;
                    cur = temp;
                    index++;
                }
                /*
                 这里的 反转的 模板是不能变的
                 */
                temp = cur.next;
                cur.next = pre;
                // reverse
                if(leftNode != null){
                    leftNode.next.next = temp;
                    leftNode.next = cur;
                }else{
                    listNode1.next = temp;
                }
                return  head;
            }
            pre = cur;
            cur = cur.next;
        }

        return head;
    }


    class ListNode{
        int val;
        ListNode next;
        public ListNode(int val){
            this.next = next;
        }

    }


}
